package com.geor.gcv.core.mat;

import java.util.ArrayList;
import java.util.List;

import com.geor.gcv.core.model.Area;
import com.geor.gcv.core.model.Node;

/**
 * 域
 * 
 * @author geor.lusongnan
 */
public class DomainImpl implements Domain {

	public List<Node> nodes = new ArrayList<Node>();

	@Override
	public String toString() {
		return nodes.toString();
	}

	public int getSize() {
		return nodes.size();
	}

	@Override
	public Area getArea() {
		// 得到nodes 里面 col最小值
		int minCol = getMinCol();
		// 得到nodes 里面col最大值
		int maxCol = getMaxCol();
		// 得到nodes 里面 row最小值
		int minRow = getMinRow();
		// 得到nodes 里面row最大值
		int maxRow = getMaxRow();

		int x = minCol < 0 ? 0 : minCol;
		int y = minRow < 0 ? 0 : minRow;
		int width = maxCol - x;
		int height = maxRow - y;

		return new Area(x, y, width, height);
	}

	private int getMaxRow() {
		int value = nodes.get(0).row;
		for (int i = 1; i < nodes.size(); i++) {
			value = Math.max(value, nodes.get(i).row);
		}
		return value;
	}

	private int getMaxCol() {
		int value = nodes.get(0).col;
		for (int i = 1; i < nodes.size(); i++) {
			value = Math.max(value, nodes.get(i).col);
		}
		return value;
	}

	private int getMinRow() {
		int value = nodes.get(0).row;
		for (int i = 1; i < nodes.size(); i++) {
			value = Math.min(value, nodes.get(i).row);
		}
		return value;
	}

	private int getMinCol() {
		int value = nodes.get(0).col;
		for (int i = 1; i < nodes.size(); i++) {
			value = Math.min(value, nodes.get(i).col);
		}
		return value;
	}

	public DomainImpl clone() {

		List<Node> temps = new ArrayList<Node>();
		for (int i = 0; i < nodes.size(); i++) {
			temps.add(nodes.get(i).clone());
		}
		DomainImpl surface = new DomainImpl();
		surface.nodes = temps;
		return surface;
	}
}
